package org.example.topicExchange;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author 望轩
 * @createDate 2024/7/4 16:16
 * 这里主要是把主题交换机和各种主题下的分类队列关联起来，也就是通过路由关联起来。TopicExchange主题交换机只有一个，但是分类队列有很多个。
 * 比如这里是一个新闻发布的例子，只有一个新闻交换机，但是因为我们有不同类型的新闻，有的是政治新闻，有的是运动新闻，有的是娱乐新闻，因此每种新闻
 * 发布的时候我们都是使用的不同的消息队列进行接收的。这里是配置关联的地方
 */
@Configuration
public class RabbitConfig {

    @Bean
    public TopicExchange newsExchange() {
        return new TopicExchange("news.exchange");
    }

    @Bean
    public Queue politicsQueue() {
        return new Queue("politics.queue", true);
    }

    @Bean
    public Queue sportsQueue() {
        return new Queue("sports.queue", true);
    }

    @Bean
    public Queue entertainmentQueue() {
        return new Queue("entertainment.queue", true);
    }

    @Bean
    public Binding politicsBinding(TopicExchange newsExchange, Queue politicsQueue) {
        //使用topicExchange主题交换机的时候，路由可以使用通配符*和#进行模糊匹配
        return BindingBuilder.bind(politicsQueue).to(newsExchange).with("politics.*");
    }

    @Bean
    public Binding sportsBinding(TopicExchange newsExchange, Queue sportsQueue) {
        return BindingBuilder.bind(sportsQueue).to(newsExchange).with("sports.*");
    }

    @Bean
    public Binding entertainmentBinding(TopicExchange newsExchange, Queue entertainmentQueue) {
        return BindingBuilder.bind(entertainmentQueue).to(newsExchange).with("entertainment.*");
    }
}
